package code12._class;

import java.util.Arrays;
import java.util.Comparator;

import org.junit.Test;

public class TestNoneNameClass {
	@Test
	public void f1() {
		MyInterface m1 = new MyInterImpl();
		m1.show();
		// 有名称的类, 可以重复使用
		MyInterface m2 = new MyInterImpl();
		m2.show();
		
		// 创建一个MyInterface的实现类，但不想设置实现类名, 并使用该类创建对象
		// 此写法类似 创建了接口的对象
		// 具体表示，创建了一个 该接口的实现类，并同时使用该类创建了一个对象，该类无法指定类名
		// 这种类称为 匿名内部类。匿名内部类不能独立存在，一般都是和创建该类的对象的语句同时出现的。
		MyInterface m3 = new MyInterface() {
			@Override
			public void show() {
				System.out.println("TestNoneNameClass.f1().new MyInterface() {...}.show()");
			}
		};
		
		MyInterface m4 = new MyInterface() {
			@Override
			public void show() {
				System.out.println("TestNoneNameClass.f1().new MyInterface() {...}.show()");
			}
		};
		System.out.println("m3.getClass():"+m3.getClass());
		System.out.println("m4.getClass():"+m4.getClass());
	}
	@Test
	public void f2() {
		Integer[] arr = {11, 33, 10, 15, 8, 5};
		// 默认升序排序
		Arrays.sort(arr);
		System.out.println("sort1:" + Arrays.toString(arr));
		System.out.println("-------");
		// Comparator 自定义比较规则，可以用于比较 未实现 Comparable 接口的类型对象
		Arrays.sort(arr, new MyComparator());
		System.out.println("sort2:" + Arrays.toString(arr));
		System.out.println("-------");
		
		// 使用匿名内部类
		Arrays.sort(arr, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				// 按数字长度比较，相同，按数值比较
				String s1 = o1.toString();
				String s2 = o2.toString();
				if (s1.length() == s2.length()) {
					return o1.intValue() - o2.intValue();
				}
				return s2.length() - s1.length();
			}
		});
		System.out.println("sort3:" + Arrays.toString(arr));
		
		// jdk8新特性
		Arrays.sort(arr, (o1, o2) -> o2.intValue() - o1.intValue());
		System.out.println("sort4:" + Arrays.toString(arr));
	}
}
// Integer 对象的比较规则
class MyComparator implements Comparator<Integer> {
	@Override
	public int compare(Integer o1, Integer o2) {
		// 降序
		return o2.intValue() - o1.intValue();
	}
}
interface MyInterface {
	void show();
}
// 有名称的类
class MyInterImpl implements MyInterface {
	@Override
	public void show() {
		System.out.println("MyInterImpl.show()");
	}
}
